shadow: Re-initialise page_info's lock field when freeing shadow pages.
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 27 Jun 2008 13:38:41 +0000 (14:38 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 27 Jun 2008 13:38:41 +0000 (14:38 +0100)
Fixes boot failure of xenU after destroying a HVM guest.

Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/mm/shadow/common.c

index 34cddea6d785c67e0cf350f5b47ac0ab4b4b3079..9200930e799d713f24d4f8433ed440ace8f00df5 100644 (file)
@@ -1830,6 +1830,14 @@ static unsigned int sh_set_allocation(struct domain *d,
             sp = list_entry(d->arch.paging.shadow.freelists[order].next,
                             struct shadow_page_info, list);
             list_del(&sp->list);
+#if defined(__x86_64__)
+            /*
+             * Re-instate lock field which we overwrite with shadow_page_info.
+             * This was safe, since the lock is only used on guest pages.
+             */
+            for ( j = 0; j < 1U << order; j++ )
+                spin_lock_init(&((struct page_info *)sp)[j].lock);
+#endif
             d->arch.paging.shadow.free_pages -= 1 << order;
             d->arch.paging.shadow.total_pages -= 1 << order;
             free_domheap_pages((struct page_info *)sp, order);